package com.zjl.redis.第11章_redis多线程;

/**
 * 1.Blocking IO         -阻塞I0
 * 2.NoneBlocking IO     -非阻塞IQ
 * 3.IO multiplexing     - IO多路复用
 * 4.signal driven IO    -信号驱动IO
 * 5.asynchronous IO     -异步IO
 *
 *
 *
 *
 * **********************IO multiplexing  - I0多路复用  详解***********************
 * 文件描述符(File descriptor)是计算机科学中的一个术语， 是一个用于表述指向文件的引用的抽象化概念。
 * 文件描述符在形式上是一个非 负整数
 * 实际上，它是一个索引值，指向内核为每一个进程所维护的该进程打开文件的记录表。
 * 当程序打开一个现有文件或者创建一个新文件时，内核向进程返回一个文件描述符。
 * 在程序设计中，文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
 *
 * 一种同步的IO模型，实现一个线程监视多个文件句柄，
 * 一旦某个文件句柄就绪就能够通知到对应应用程序进行相应的读写操作，没有文件句柄就绪时就会阻塞应用程序,
 * 从而释放CPU资源
 *
 * I/O : 网络I/O,尤其在操作系统层面指数据在内核态和用户态之间的读写操作
 * 多路  : 多个客户端连接(连接就是套接字描述符，即socket或者channel)
 * 复用  : 复用一个或几个线程。
 *
 * IO多路复用
 *
 *      也就是说一个或一组线程处理多个TCP连接,使用单进程就能够实现同时处理多个客户端的连接,
 *      无需创建或者维护过多的进程/线程
 * 一句话:
 *      一个服务端进程可以同时处理多个套接字描述符。
 *      实现IO多路复用的模型有3种:可以分 select- > poll-> epoll 三个阶段来描述。
 *
 * 例子
 *
 * 模拟一个tcp服务器处理30个客户socket.
 * 假设你是一个监考老师，让30个学生解答一道 竞赛考题，然后负责验收学生答卷，你有下面几个选择:
 *
 * 第一种选择(轮询):
 *      按顺序逐个验收，先验收A，然后是B，之后是C、 D....这中间如果有一个学生卡住，全班都会被耽误,
 *      你用循环挨个处理socket， 根本不具有并发能力。
 * 第二种选择(来一个new一个，1对1服务):你创建30个分身线程，每个分身线程检查一个学生的答案是否正确。
 *      这种类似 于为每一个用户创建一个进程或者线程处理连接。
 * 第三种选择(响应式处理，1对多服务)，你站在讲台上等，谁解答完谁举手。
 *      这时C、D举手，表示他们解答问题完毕，你下去依次检查C、D的答案，
 *      然后继续回到讲台上等I此时E、A又举手，然后去处理E和A。。。这种就是I0复用模型。
 *      Linux下的select. poll和epoll就是干这个的。
 *
 */
public class D_五种IO模型_详解IO多路复用 {

}
